package cn.tedu.shoppingmall.service;


import cn.tedu.shoppingmall.mapper.UserMapper;
import cn.tedu.shoppingmall.vo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

// 添加注解保存到Spring容器中,以方便需要的位置调用
@Component
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserMapper userMapper;

    // 下面的方法是实现登录的关键,是Spring-Security规定我们实现的方法
    // 方法的参数是用户在登录表单中输入的用户名
    // 利用用户输入的用户名查询出其他信息,比如数据库中的密码和所有权限
    // 最终将这些信息保存在UserDetails对象中返回
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//        System.out.println("进来了UserDetailsUsername = " + username);
        //方法的参数是要登录的用户的用户名username
        //1. 根据用户名获得用户对象
        User user=userMapper.selectByUsername(username);
//        System.out.println("查出的user为::::== "+ user );
        //2. 验证用户对象是不是为空,如果为空登录失败
        if(user==null){
            return null;
        }

        //5. 创建UserDetails对象,并向它的属性中赋值
        UserDetails details= org.springframework.security.core
                .userdetails.User.builder()
                .username(user.getUsername())
                .password(user.getPassword())
                .authorities("ROLE_ ") //表里没有权限列,这个不知道怎么填
                .build();
        //6. 返回UserDetails对象
        // 千万别忘了返回details
//        System.out.println("返回的detail为: "+details);
        return details;
    }

//    public String loginExist(@AuthenticationPrincipal UserDetails userDetails){ //rem用来确认记住密码
//        User u = userMapper.selectByUsername(userDetails.getUsername());
//        if (u!=null){
//            return "你已经登陆过了,请先注销登陆后,再登录"; //别轻易改,再前端login页面有判断
//        }
//        return null;
//    }
//
//    @Override
//    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//        User user=userMapper.selectByUsername(username);
//        System.out.println("查出的user为::::== "+ user );
//        //2. 验证用户对象是不是为空,如果为空登录失败
//        if(user==null){
//            return null;
//        }
//        // 定义权限的集合 - 全部存的是权限
//        List<GrantedAuthority> authorityList = new ArrayList<>();
//        // 添加用户拥有的角色 - 可以从数据库中读取
//        authorityList.add(new SimpleGrantedAuthority("ROLE_SELLER"));
//        // 判断用户名是否为空，如果为空直接返回null
//        if (username == null) {
//            return null;
//        }
//        // 参数：用户名、密码、权限集合  密码前拼接{noop} 表示不加密
//        UserDetails userDetails = new User(username, "{noop}"+seller.getPassword(), authorityList);
//        return userDetails;
//    }
        @Bean // 配置加密类
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
//        return PasswordEncoderFactories.createDelegatingPasswordEncoder(); // 返回一个加密类
    }

}
